<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>rest参数</title>
</head>
<body>
  <script>
    // ES6引入rest参数(形式为...变量名)，用于获取函数的多余参数，这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组，
    // 该变量将多余的参数放入数组中。
    function add(...values) {
      var sum = 0
      for (var val of values) {
        sum += val
      }
      return sum
    }
    add(2,5,3)
    console.log(add(2,5,3)) // 10
  </script>
  <script>
    // 下面是一个rest参数代替arguments变量的例子
    // arguments变量的写法
    function sortName() {
      return Array.from(arguments).sort()
    }
    // rest参数的写法
    const sortNumbers = (...numbers) => numbers.sort()
    /**
     * rest参数的写法更自然也更简洁
     * arguments对象不是数组，而是一个类似数组的对象。为了使用数组的方法，必须使用Array.from先将其转为数组。rest参数就不存在这个问题
     * 他就是一个真正的数组，下面是一个利用rest参数改写数组push方法的例子
    */
   function push(array, ...items) {
     items.forEach(function(item){
       array.push(item)
       console.log(item)
     })
   }
   var a = []
   var b = [4,5,6,7,8,9]
   push(a, 1,2,3, ...b)
   console.log(a)
   /**
    * 同样，rest参数只能是尾参，且使用后函数的length属性将失真。
   */
  </script>
</body>
</html>